Android 8.0适配
准备工作
将我们项目中的targetSdkVersion改为 26(8.0) 或者 27(8.1),记住不要超过27,毕竟我还没有告诉你Android P怎么适配(/滑稽)。
Android 8.0 行为变更
1.提醒窗口
如果应用使用 1
2
3
4
5
6```
- TYPE_PHONE
- TYPE_PRIORITY_PHONE
- TYPE_SYSTEM_ALERT
- TYPE_SYSTEM_OVERLAY
- TYPE_SYSTEM_ERROR
相反,应用必须使用名为 1
也就是说需要在之前的基础上判断一下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mWindowParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
}else {
mWindowParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
}1
当然记得需要有权限
1 |
|
- 应用的提醒窗口始终显示在状态栏和输入法等关键系统窗口的下面。
- 系统可以移动使用 TYPE_APPLICATION_OVERLAY 窗口类型的窗口或调整其大小,以改善屏幕显示效果。
- 通过打开通知栏,用户可以访问设置来阻止应用显示使用 TYPE_APPLICATION_OVERLAY 窗口类型显示的提醒窗口。
1
2### 2.网页表单自动填充
现在,Android 自动填充框架提供对自动填充功能的内置支持,对于安装到运行 Android 8.0 的设备上的应用,与 WebView 对象相关的下列函数已经发生变化:
WebSettings
- getSaveFormData() 函数现在返回 false。之前,此函数返回 true。
- 调用 setSaveFormData() 不再有任何效果。
WebViewDatabase - 调用 clearFormData() 不再有任何效果。
- hasFormData() 函数现在返回 false。之前,当表单包含数据时,此函数返回 true。
1 | ### 3.集合的处理 |
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager notificationManager = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
//分组(可选)
//groupId要唯一
String groupId = "group_001";
NotificationChannelGroup group = new NotificationChannelGroup(groupId, "广告");
//创建group
notificationManager.createNotificationChannelGroup(group);
//channelId要唯一
String channelId = "channel_001";
NotificationChannel adChannel = new NotificationChannel(channelId,
"推广信息", NotificationManager.IMPORTANCE_DEFAULT);
//补充channel的含义(可选)
adChannel.setDescription("推广信息");
//将渠道添加进组(先创建组才能添加)
adChannel.setGroup(groupId);
//创建channel
notificationManager.createNotificationChannel(adChannel);
//创建通知时,标记你的渠道id
Notification notification = new Notification.Builder(MainActivity.this, channelId)
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.setContentTitle("一条新通知")
.setContentText("这是一条测试消息")
.setAutoCancel(true)
.build();
notificationManager.notify(1, notification);
}
}1
2
3
4
5
6
7
8效果如下:

华为手机当只有一个渠道时,不会显示,会当做默认通知处理,除非一个以上。
注意:当Channel已经存在时,后面的createNotificationChannel方法仅能更新其name/description,以及对importance进行降级,其余配置均无法更新。所以如果有必要的修改只能创建新的渠道,删除旧渠道。
删除渠道代码如下:
private void deleteNotificationChannel(String channelId){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager mNotificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.deleteNotificationChannel(channelId);
}
}`
6.后台限制执行
具体说明https://developer.android.google.cn/about/versions/oreo/background
应用在两个方面受到限制:
后台服务限制: 处于空闲状态时,应用可以使用的后台服务存在限制。 这些限制不适用于前台服务,因为前台服务更容易引起用户注意。
广播限制: 除了有限的例外情况,应用无法使用清单注册隐式广播。 它们仍然可以在运行时注册这些广播,并且可以使用清单注册专门针对它们的显式广播。
在大多数情况下,应用都可以使用 JobScheduler 克服这些限制。 这种方式让应用安排为在未活跃运行时执行工作,不过仍能够使系统可以在不影响用户体验的情况下安排这些作业。
关于的用法可以参考官方例子:android-JobScheduler
https://github.com/googlesamples/android-JobScheduler
当然还有后台位置的限制需要去注意。
https://developer.android.google.cn/about/versions/oreo/background-location-limits
参考
MIUI 10 通知类别 / Channel 适配
- Create and Manage Notification Channels
https://developer.android.google.cn/training/notify-user/channels - Presentation of Notifications
https://source.android.google.cn/compatibility/8.0/android-8.0-cdd#3_8_user_interface_compatibility - Android 实现应用更新适配 Android O
https://blog.csdn.net/mq2856992713/article/details/79688587